{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "990ade18",
   "metadata": {},
   "source": [
    "## 1. 问题描述及实现目标\n",
    "\n",
    "### 1.1 问题的背景\n",
    "\n",
    "经典的MNIST数据集中包含了大量的手写数字，但是近年来在MNIST数据集上应用的各种算法已经可以达到很高的识别精度（高达99.6%），而且数字识别的问题并不能很好迁移到实际的计算机视觉的问题上来，所以为了替代经典的MNIST，德国的一家时尚科技公司Zalando提供了更新的Fashion-MNIST数据集，这个数据集中包含了来自10种类别的共7万个不同商品的正面图片，Fashion-MNIST的大小、格式和训练集/测试集划分与原始的MNIST完全一致，训练集和测试集分别包含了60000和10000个样本，每张图片都是$28\\times28$的灰度图片，可以和经典MNIST数据集一样，直接用于深度学习模型的测试。\n",
    "\n",
    "### 1.2 数据形式和程序要求\n",
    "\n",
    "#### 1.2.1 Fashion-MNIST数据形式\n",
    "\n",
    "数据集中主要包含了四个文件，他们的含义如下\n",
    "\n",
    "![1.1](figure\\1.1.jpg)\n",
    "\n",
    "在设计程序的过程中，我们还是将原来的gz文件转成我们较为熟悉的**csv文件**，其数据形式如下所示\n",
    "\n",
    "![1.2](figure\\1.2.jpg)\n",
    "\n",
    "其中每个标签对应的物品如下\n",
    "\n",
    "![1.3](figure\\1.3.jpg)\n",
    "\n",
    "#### 1.2.2 程序的实现目标\n",
    "\n",
    "1.\t构建深度神经网络，完成多分类。\n",
    "2.\t编写爬虫程序，到taobao等网站抓取一些衣服、鞋子的图片，并利用训练好的模型进行分类\n",
    "3.\t对于未属于训练数据集中的商品类别，考虑使用何种方法能够判断出类别为不支持的类别？\n",
    "4.\t评估自己抓取图像的分类精度。\n",
    "5.\t分析结果的效果，综合考虑各种方法，改进方法，并提交结果。\n",
    "6.\t按照report_template.ipynb撰写自己的报告 \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7cbfee71",
   "metadata": {},
   "source": [
    "## 2. 程序实现所需的基础知识和背景\n",
    "\n",
    "### 2.1 卷积神经网络知识\n",
    "\n",
    "#### 2.1.1 卷积(Convolution)基本概念\n",
    "\n",
    "卷积在图像处理领域被广泛的应用，像滤波、边缘检测、图片锐化等，都是通过不同的卷积核来实现的。在卷积神经网络中通过卷积操作可以提取图片中的特征，低层的卷积层可以提取到图片的一些边缘、线条、角等特征，高层的卷积能够从低层的卷积层中学到更复杂的特征，从而实现到图片的分类和识别。\n",
    "\n",
    "![2.1](figure\\2.1.jpg)\n",
    "\n",
    "如图所示，上图展示了一个卷积的过程，其中蓝色的图片($5\\times5$)表示的是进行卷积的图片，阴影的图片($4\\times4$)表示的是卷积核，绿色的图片($5\\times5$)表示是进行卷积计算之后的图片。而卷积之后输出结果和输入图片的尺寸、步长、卷积核的大小、输出图片的尺寸、填充大小都有关系，下面进行详细介绍。\n",
    "\n",
    "#### 2.1.2 卷积中的重要参数\n",
    "\n",
    "* **输入图片的尺寸i:**上图中的蓝色图片(5*5)，表示的是需要进行卷积操作的图片。\n",
    "\n",
    "* **卷积核的大小(尺寸为k):**上图中的会移动阴影图片表示的是卷积核(4*4)，通过不同参数不同大小的卷积核可以提取到图片的不同特征。\n",
    "\n",
    "* **步长s:**是指卷积核移动的长度，上图卷积核水平方向移动的步长和垂直方向移动的步长是一样的都是1\n",
    "\n",
    "* **填充大小p:**是指在输入图片周围填充的圈数，通常都是用0来进行填充的，上图中蓝色图片周围两圈虚线的矩形表示的是填充的值，所以padding是2。\n",
    "\n",
    "* **输出图片的尺寸o:**经过卷积操作之后获取到的图片的大小，上图的绿色图片(6*6)。\n",
    "如果已知i、k、p、s，可以求得输出图片的尺寸o，计算公式如下：\n",
    "\n",
    "$$o=\\frac{i-k+2p}{s}$$\n",
    "\n",
    "#### 2.1.3 卷积神经网络的构成\n",
    "\n",
    "组成一个卷积神经网络，需要多个不同功能的层，典型的CNN中通常包含了卷积层、ReLU层、池化层和全连接层，他们的功能分别如下所示：\n",
    "\n",
    "* **卷积层(Convolutional layer):**卷积神经网路中每层卷积层由若干卷积单元组成，每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征，第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级，更多层的网络能从低级特征中迭代提取更复杂的特征。\n",
    "\n",
    "* **线性整流层（ReLU layer）:**这一层神经的激活函数(Activate Function)为ReLU： \n",
    "\n",
    "$$f\\left(x\\right)=max\\left(0,x\\right)$$\n",
    "\n",
    "* **池化层(Pooling layer):**通常在卷积层之后会得到维度很大的特征，将特征切成几个区域，取其最大值或平均值，得到新的、维度较小的特征。\n",
    "\n",
    "* **全连接层(Fully-Connected layer):** 把所有局部特征结合变成全局特征，用来计算最后每一类的得分。\n",
    "在处理实际问题的时候，这四个层之间的常用连接关系示意如下图所示\n",
    "\n",
    "![2.2](figure\\2.2.jpg)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ba8d99c",
   "metadata": {},
   "source": [
    "### 2.2 PyTorch\n",
    "\n",
    "在建立CNN的过程中，我们主要使用的工具是PyTorch，引用torch.nn可以获得我们构建神经网络所需要的基本的模块，我们可以通过定义一个nn.Module子类的形式来定义我们自己的神经网络的类，PyTorch官网上给出的示例形式如下所示(仅供示意)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5c3d54fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch import nn\n",
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(NeuralNetwork, self).__init__()\n",
    "        self.flatten = nn.Flatten()\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(28*28, 512),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(512, 512),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(512, 10),\n",
    "        )\n",
    "    def forward(self, x):\n",
    "        x = self.flatten(x)\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        return logits"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad4805c9",
   "metadata": {},
   "source": [
    "其中__init__是对神经网络的初始化，而对输入数据的操作则都定义在__forward__中，我们可以直接打印得到神经网络的结构，在后文中会进行详细叙述。\n",
    "\n",
    "## 3. 神经网络的实现和程序运行结果\n",
    "\n",
    "### 3.1 神经网络的结构\n",
    "\n",
    "经过网上教程的搜寻，以及前期的参数调节，最后可以得到，参数设计如下所示时，获取的结果时比较理想的：(为了表述精确此处使用英文)\n",
    "\n",
    "**Sequential Layer 1:**\n",
    "\n",
    "* Convolutional layer: kernel size 3*3, padding=1, stride=1\n",
    "\n",
    "* Batch normalization layer\n",
    "\n",
    "* Activation function: ReLU\n",
    "\n",
    "* Max pooling layer: kernel size 2*2, stride=2\n",
    "\n",
    "**Sequential Layer 2:**\n",
    "\n",
    "* Convolutional layer: kernel size 3*3, padding=0, stride=1\n",
    "\n",
    "* Batch normalization layer\n",
    "\n",
    "* Activation function: ReLU\n",
    "\n",
    "* Max pooling layer: kernel size 2*2, stride=2\n",
    "\n",
    "**Fully-connected Layer:**\n",
    "\n",
    "* Flatten out the output for dense layer (fully-connnected)\n",
    "\n",
    "* Fully-connected layer 1\n",
    "\n",
    "* 1 Dropout layer, probability p = 0.25\n",
    "\n",
    "* Fully-connected layer 2&3\n",
    "\n",
    "**神经网络中每层的输入输出维度如下所示：**\n",
    "\n",
    "* First Conv layer : input: 28 * 28 * 3, output: 28 * 28 * 32\n",
    "* First Max Pooling layer : input: 28 * 28 * 32, output: 14 * 14 * 32\n",
    "* Second Conv layer : input : 14 * 14 * 32, output: 12 * 12 * 64\n",
    "* Second Max Pooling layer : 12 * 12 * 64, output: 6 * 6 * 64\n",
    "* Fully-connected layer: 10 output features for 10 types of clothes.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f83122b",
   "metadata": {},
   "source": [
    "### 3.2 神经网络的程序实现\n",
    "\n",
    "设计好神经网络的结构之后我们就可以编程定义神经网络，主要的步骤可以分为四步：首先是导入数据集并进行处理，然后是定义神经网络结构，接着是建立CNN模型，最后对模型进行训练得到结果并且分析损失函数和精度，下面分别介绍每个部分的程序。\n",
    "\n",
    "#### 3.2.1 导入数据并进行预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "97fb553a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# import commands\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "from torch.autograd import Variable\n",
    "\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "from sklearn.metrics import confusion_matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "010c15a7",
   "metadata": {},
   "source": [
    "当GPU可用时则用它进行计算，否则使用CPU进行计算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "026fb087",
   "metadata": {},
   "outputs": [],
   "source": [
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3025d2b",
   "metadata": {},
   "source": [
    "将原来的文件转成csv文件的形式进行读取，其中csv文件第一列是标签，28x28的图片的数据总共有784列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f70a1271",
   "metadata": {},
   "outputs": [],
   "source": [
    "# load file\n",
    "train_csv = pd.read_csv(\"data_/fashion-mnist_train.csv\")\n",
    "test_csv = pd.read_csv(\"data_/fashion-mnist_test.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "6fbf8a4f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label</th>\n",
       "      <th>pixel1</th>\n",
       "      <th>pixel2</th>\n",
       "      <th>pixel3</th>\n",
       "      <th>pixel4</th>\n",
       "      <th>pixel5</th>\n",
       "      <th>pixel6</th>\n",
       "      <th>pixel7</th>\n",
       "      <th>pixel8</th>\n",
       "      <th>pixel9</th>\n",
       "      <th>...</th>\n",
       "      <th>pixel775</th>\n",
       "      <th>pixel776</th>\n",
       "      <th>pixel777</th>\n",
       "      <th>pixel778</th>\n",
       "      <th>pixel779</th>\n",
       "      <th>pixel780</th>\n",
       "      <th>pixel781</th>\n",
       "      <th>pixel782</th>\n",
       "      <th>pixel783</th>\n",
       "      <th>pixel784</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>30</td>\n",
       "      <td>43</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59995</th>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59996</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>73</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59997</th>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>160</td>\n",
       "      <td>162</td>\n",
       "      <td>163</td>\n",
       "      <td>135</td>\n",
       "      <td>94</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59998</th>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59999</th>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>60000 rows × 785 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       label  pixel1  pixel2  pixel3  pixel4  pixel5  pixel6  pixel7  pixel8  \\\n",
       "0          2       0       0       0       0       0       0       0       0   \n",
       "1          9       0       0       0       0       0       0       0       0   \n",
       "2          6       0       0       0       0       0       0       0       5   \n",
       "3          0       0       0       0       1       2       0       0       0   \n",
       "4          3       0       0       0       0       0       0       0       0   \n",
       "...      ...     ...     ...     ...     ...     ...     ...     ...     ...   \n",
       "59995      9       0       0       0       0       0       0       0       0   \n",
       "59996      1       0       0       0       0       0       0       0       0   \n",
       "59997      8       0       0       0       0       0       0       0       0   \n",
       "59998      8       0       0       0       0       0       0       0       0   \n",
       "59999      7       0       0       0       0       0       0       0       0   \n",
       "\n",
       "       pixel9  ...  pixel775  pixel776  pixel777  pixel778  pixel779  \\\n",
       "0           0  ...         0         0         0         0         0   \n",
       "1           0  ...         0         0         0         0         0   \n",
       "2           0  ...         0         0         0        30        43   \n",
       "3           0  ...         3         0         0         0         0   \n",
       "4           0  ...         0         0         0         0         0   \n",
       "...       ...  ...       ...       ...       ...       ...       ...   \n",
       "59995       0  ...         0         0         0         0         0   \n",
       "59996       0  ...        73         0         0         0         0   \n",
       "59997       0  ...       160       162       163       135        94   \n",
       "59998       0  ...         0         0         0         0         0   \n",
       "59999       0  ...         0         0         0         0         0   \n",
       "\n",
       "       pixel780  pixel781  pixel782  pixel783  pixel784  \n",
       "0             0         0         0         0         0  \n",
       "1             0         0         0         0         0  \n",
       "2             0         0         0         0         0  \n",
       "3             1         0         0         0         0  \n",
       "4             0         0         0         0         0  \n",
       "...         ...       ...       ...       ...       ...  \n",
       "59995         0         0         0         0         0  \n",
       "59996         0         0         0         0         0  \n",
       "59997         0         0         0         0         0  \n",
       "59998         0         0         0         0         0  \n",
       "59999         0         0         0         0         0  \n",
       "\n",
       "[60000 rows x 785 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# file preview:data_train\n",
    "train_csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "230897f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label</th>\n",
       "      <th>pixel1</th>\n",
       "      <th>pixel2</th>\n",
       "      <th>pixel3</th>\n",
       "      <th>pixel4</th>\n",
       "      <th>pixel5</th>\n",
       "      <th>pixel6</th>\n",
       "      <th>pixel7</th>\n",
       "      <th>pixel8</th>\n",
       "      <th>pixel9</th>\n",
       "      <th>...</th>\n",
       "      <th>pixel775</th>\n",
       "      <th>pixel776</th>\n",
       "      <th>pixel777</th>\n",
       "      <th>pixel778</th>\n",
       "      <th>pixel779</th>\n",
       "      <th>pixel780</th>\n",
       "      <th>pixel781</th>\n",
       "      <th>pixel782</th>\n",
       "      <th>pixel783</th>\n",
       "      <th>pixel784</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>8</td>\n",
       "      <td>...</td>\n",
       "      <td>103</td>\n",
       "      <td>87</td>\n",
       "      <td>56</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>34</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>14</td>\n",
       "      <td>53</td>\n",
       "      <td>99</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>63</td>\n",
       "      <td>53</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>137</td>\n",
       "      <td>126</td>\n",
       "      <td>140</td>\n",
       "      <td>0</td>\n",
       "      <td>133</td>\n",
       "      <td>224</td>\n",
       "      <td>222</td>\n",
       "      <td>56</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9995</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>32</td>\n",
       "      <td>23</td>\n",
       "      <td>14</td>\n",
       "      <td>20</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9996</th>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>52</td>\n",
       "      <td>23</td>\n",
       "      <td>28</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9997</th>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>175</td>\n",
       "      <td>172</td>\n",
       "      <td>172</td>\n",
       "      <td>182</td>\n",
       "      <td>199</td>\n",
       "      <td>222</td>\n",
       "      <td>42</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9998</th>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9999</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>140</td>\n",
       "      <td>119</td>\n",
       "      <td>...</td>\n",
       "      <td>111</td>\n",
       "      <td>95</td>\n",
       "      <td>75</td>\n",
       "      <td>44</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10000 rows × 785 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      label  pixel1  pixel2  pixel3  pixel4  pixel5  pixel6  pixel7  pixel8  \\\n",
       "0         0       0       0       0       0       0       0       0       9   \n",
       "1         1       0       0       0       0       0       0       0       0   \n",
       "2         2       0       0       0       0       0       0      14      53   \n",
       "3         2       0       0       0       0       0       0       0       0   \n",
       "4         3       0       0       0       0       0       0       0       0   \n",
       "...     ...     ...     ...     ...     ...     ...     ...     ...     ...   \n",
       "9995      0       0       0       0       0       0       0       0       0   \n",
       "9996      6       0       0       0       0       0       0       0       0   \n",
       "9997      8       0       0       0       0       0       0       0       0   \n",
       "9998      8       0       1       3       0       0       0       0       0   \n",
       "9999      1       0       0       0       0       0       0       0     140   \n",
       "\n",
       "      pixel9  ...  pixel775  pixel776  pixel777  pixel778  pixel779  pixel780  \\\n",
       "0          8  ...       103        87        56         0         0         0   \n",
       "1          0  ...        34         0         0         0         0         0   \n",
       "2         99  ...         0         0         0         0        63        53   \n",
       "3          0  ...       137       126       140         0       133       224   \n",
       "4          0  ...         0         0         0         0         0         0   \n",
       "...      ...  ...       ...       ...       ...       ...       ...       ...   \n",
       "9995       0  ...        32        23        14        20         0         0   \n",
       "9996       0  ...         0         0         0         2        52        23   \n",
       "9997       0  ...       175       172       172       182       199       222   \n",
       "9998       0  ...         0         0         0         0         0         1   \n",
       "9999     119  ...       111        95        75        44         1         0   \n",
       "\n",
       "      pixel781  pixel782  pixel783  pixel784  \n",
       "0            0         0         0         0  \n",
       "1            0         0         0         0  \n",
       "2           31         0         0         0  \n",
       "3          222        56         0         0  \n",
       "4            0         0         0         0  \n",
       "...        ...       ...       ...       ...  \n",
       "9995         1         0         0         0  \n",
       "9996        28         0         0         0  \n",
       "9997        42         0         1         0  \n",
       "9998         0         0         0         0  \n",
       "9999         0         0         0         0  \n",
       "\n",
       "[10000 rows x 785 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_csv"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae02a92d",
   "metadata": {},
   "source": [
    "因为在使用pytorch时我们需要将csv的文件转成Tensor，所以这里我们定义一个FashionDataset的类来进行相关的操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2e62fddc",
   "metadata": {},
   "outputs": [],
   "source": [
    "class FashionDataset(Dataset):\n",
    "    \"\"\"User defined class to build a datset using Pytorch class Dataset.\"\"\"\n",
    "    \n",
    "    def __init__(self, data, transform = None):\n",
    "        \"\"\"Method to initilaize variables.\"\"\" \n",
    "        self.fashion_MNIST = list(data.values)\n",
    "        self.transform = transform\n",
    "        \n",
    "        label = []\n",
    "        image = []\n",
    "        \n",
    "        for i in self.fashion_MNIST:\n",
    "             # first column are the labels\n",
    "            label.append(i[0])\n",
    "            image.append(i[1:])\n",
    "        self.labels = np.asarray(label)\n",
    "        # Dimension of Images = 28 * 28 * 1. where height = width = 28 and color_channels = 1.\n",
    "        self.images = np.asarray(image).reshape(-1, 28, 28, 1).astype('float32')\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        label = self.labels[index]\n",
    "        image = self.images[index]\n",
    "        \n",
    "        if self.transform is not None:\n",
    "            image = self.transform(image)\n",
    "\n",
    "        return image, label\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fffc1138",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Transform data into Tensor that has a range from 0 to 1\n",
    "train_set = FashionDataset(train_csv, transform=transforms.Compose([transforms.ToTensor()]))\n",
    "test_set = FashionDataset(test_csv, transform=transforms.Compose([transforms.ToTensor()]))\n",
    "\n",
    "train_loader = DataLoader(train_set, batch_size=100)\n",
    "test_loader = DataLoader(train_set, batch_size=100)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0cf18cbe",
   "metadata": {},
   "source": [
    "最后我们就可以在train_loader和test_loader上对数据集进行训练"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a25e114",
   "metadata": {},
   "source": [
    "由于我们总共有10个种类的服饰，所以同样为了方便结果展示，我们可以定义一个函数，输入标签时输出对应的服饰名称"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "dce745fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "def output_label(label):\n",
    "    output_mapping = {\n",
    "                 0: \"T-shirt/Top\",\n",
    "                 1: \"Trouser\",\n",
    "                 2: \"Pullover\",\n",
    "                 3: \"Dress\",\n",
    "                 4: \"Coat\", \n",
    "                 5: \"Sandal\", \n",
    "                 6: \"Shirt\",\n",
    "                 7: \"Sneaker\",\n",
    "                 8: \"Bag\",\n",
    "                 9: \"Ankle Boot\"\n",
    "                 }\n",
    "    input = (label.item() if type(label) == torch.Tensor else label)\n",
    "    return output_mapping[input]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8e2a28c6",
   "metadata": {},
   "source": [
    "#### 3.2.2 定义神经网络结构\n",
    "\n",
    "按照3.1节中所述的网络结构，定义如下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "04671d6b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Building CNN network\n",
    "class FashionCNN(nn.Module):\n",
    "    \n",
    "    def __init__(self):\n",
    "        super(FashionCNN, self).__init__()\n",
    "        \n",
    "        self.layer1 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1),\n",
    "            nn.BatchNorm2d(32),\n",
    "            nn.ReLU(),\n",
    "            nn.MaxPool2d(kernel_size=2, stride=2)\n",
    "        )\n",
    "        \n",
    "        self.layer2 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3),\n",
    "            nn.BatchNorm2d(64),\n",
    "            nn.ReLU(),\n",
    "            nn.MaxPool2d(2)\n",
    "        )\n",
    "        \n",
    "        self.fc1 = nn.Linear(in_features=64*6*6, out_features=600)\n",
    "        self.drop = nn.Dropout2d(0.25)\n",
    "        self.fc2 = nn.Linear(in_features=600, out_features=120)\n",
    "        self.fc3 = nn.Linear(in_features=120, out_features=10)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        out = self.layer1(x)\n",
    "        out = self.layer2(out)\n",
    "        out = out.view(out.size(0), -1)\n",
    "        out = self.fc1(out)\n",
    "        out = self.drop(out)\n",
    "        out = self.fc2(out)\n",
    "        out = self.fc3(out)\n",
    "        \n",
    "        return out"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dfe707e9",
   "metadata": {},
   "source": [
    "#### 3.2.3 建立CNN模型\n",
    "\n",
    "我们为创建的FashionCNN的类创立一个对象作为模型进行训练，并且将它转移到GPU上进行计算.并且我们将学习过程中用于评价的损失函数定义为CrossEntropy，学习率定为0.001，并采用Adam优化器进行优化。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "39f3be98",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "FashionCNN(\n",
       "  (layer1): Sequential(\n",
       "    (0): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (2): ReLU()\n",
       "    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
       "  )\n",
       "  (layer2): Sequential(\n",
       "    (0): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1))\n",
       "    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (2): ReLU()\n",
       "    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
       "  )\n",
       "  (fc1): Linear(in_features=2304, out_features=600, bias=True)\n",
       "  (drop): Dropout2d(p=0.25, inplace=False)\n",
       "  (fc2): Linear(in_features=600, out_features=120, bias=True)\n",
       "  (fc3): Linear(in_features=120, out_features=10, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# make the model of CNN class\n",
    "model = FashionCNN()\n",
    "model.to(device)\n",
    "\n",
    "# define the loss function, here we use cross-entropy\n",
    "error = nn.CrossEntropyLoss()\n",
    "\n",
    "learning_rate = 0.001\n",
    "# Using Adam algorithm for optimization purpose\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)\n",
    "# 在训练之前，我们可以将定义对象的CNN网络结构打印出来\n",
    "model"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56b14b44",
   "metadata": {},
   "source": [
    "#### 3.2.4 模型训练（结果及精度分析在3.3节详述）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "fc73bf0e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration: 500, Loss: 0.5449973940849304, Accuracy: 88.83333587646484%\n",
      "Iteration: 1000, Loss: 0.24321115016937256, Accuracy: 90.83499908447266%\n",
      "Iteration: 1500, Loss: 0.286397784948349, Accuracy: 90.30000305175781%\n",
      "Iteration: 2000, Loss: 0.20573048293590546, Accuracy: 91.55667114257812%\n",
      "Iteration: 2500, Loss: 0.2153567522764206, Accuracy: 92.22333526611328%\n",
      "Iteration: 3000, Loss: 0.19330871105194092, Accuracy: 93.66000366210938%\n"
     ]
    }
   ],
   "source": [
    "# Network training parameters\n",
    "num_epochs = 5\n",
    "count = 0\n",
    "# Lists for visualization of loss and accuracy \n",
    "loss_list = []\n",
    "iteration_list = []\n",
    "accuracy_list = []\n",
    "\n",
    "# Lists for knowing classwise accuracy\n",
    "predictions_list = []\n",
    "labels_list = []\n",
    "\n",
    "for epoch in range(num_epochs):\n",
    "    for images, labels in train_loader:\n",
    "        # Transfering images and labels to GPU if available\n",
    "        images, labels = images.to(device), labels.to(device)\n",
    "    \n",
    "        train = Variable(images.view(100, 1, 28, 28))\n",
    "        labels = Variable(labels)\n",
    "        \n",
    "        # Forward pass \n",
    "        outputs = model(train)\n",
    "        loss = error(outputs, labels)\n",
    "        \n",
    "        # Initializing a gradient as 0 so there is no mixing of gradient among the batches\n",
    "        optimizer.zero_grad()\n",
    "        \n",
    "        #Propagating the error backward\n",
    "        loss.backward()\n",
    "        \n",
    "        # Optimizing the parameters\n",
    "        optimizer.step()\n",
    "    \n",
    "        count += 1\n",
    "    \n",
    "    # Testing the model\n",
    "    \n",
    "        if not (count % 50):    # It's same as \"if count % 50 == 0\"\n",
    "            total = 0\n",
    "            correct = 0\n",
    "        \n",
    "            for images, labels in test_loader:\n",
    "                images, labels = images.to(device), labels.to(device)\n",
    "                labels_list.append(labels)\n",
    "            \n",
    "                test = Variable(images.view(100, 1, 28, 28))\n",
    "            \n",
    "                outputs = model(test)\n",
    "            \n",
    "                predictions = torch.max(outputs, 1)[1].to(device)\n",
    "                predictions_list.append(predictions)\n",
    "                correct += (predictions == labels).sum()\n",
    "            \n",
    "                total += len(labels)\n",
    "            \n",
    "            accuracy = correct * 100 / total\n",
    "            loss_list.append(loss.data)\n",
    "            iteration_list.append(count)\n",
    "            accuracy_list.append(accuracy)\n",
    "        \n",
    "        if not (count % 500):\n",
    "            print(\"Iteration: {}, Loss: {}, Accuracy: {}%\".format(count, loss.data, accuracy))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "17ebe3e8",
   "metadata": {},
   "source": [
    "### 3.3 训练结果及精度分析\n",
    "\n",
    "在上述过程中，首先我们将模型应用到了训练集上来训练CNN，然后我们再将其用在测试集上来输出损失函数和精度，损失函数我们存放在了loss_list当中，但是他的每一个元素都是tensor形式，所以在进行可视化之前需要提取出他的数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "39f8cbb1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# extract the loss & accuracy from tensor\n",
    "temp1 = np.zeros(len(iteration_list))\n",
    "temp1 = temp1.T\n",
    "temp2 = np.zeros(len(accuracy_list))\n",
    "temp2 = temp2.T\n",
    "for i in range(len(temp1)):\n",
    "    temp1[i] = loss_list[i].item()\n",
    "    temp2[i] = accuracy_list[i].item()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "688fd09a",
   "metadata": {},
   "source": [
    "然后我们再对loss和accuracy进行可视化，数值和图片结果分别如下所示"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "0953a043",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualizing loss and accuracy\n",
    "plt.plot(iteration_list, temp1)\n",
    "plt.xlabel(\"Iteration Number\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.title(\"Iterations vs Loss\")\n",
    "plt.show()\n",
    "\n",
    "plt.plot(iteration_list, temp2)\n",
    "plt.xlabel(\"No. of Iteration\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.title(\"Iterations vs Accuracy\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f78ed8d2",
   "metadata": {},
   "source": [
    "## 4. 爬虫程序及数据集在神经网络上的测试结果\n",
    "\n",
    "### 4.1 编写爬虫程序获取淘宝商品图片\n",
    "\n",
    "在训练好CNN模型之后，我们还在网上爬取相关的商品图片，作为网络的测试集，来进一步对网络的效果进行验证，爬虫的过程简单来说可以分为三步，首先是驱动浏览器找到目标网址，然后找到网页页面上的搜索框输入目标内容，最后下载搜索到的结果。下面就分别介绍我们是如何实现这些目标的。**（爬虫程序放在目录taobao.py中，图形处理程序放在目录image_processing1.py和image_processing2.py中，由于图片都是下载到本地的，压缩之前内容较大，所以在notebook中不再进行演示）**\n",
    "\n",
    "首先是要驱动浏览器，我们选择的库是selenium.webdriver，导入之后驱动chrome浏览器打开淘宝网页（需要将chromedriver提前下载到anaconda3/script的文件目录中），将chromedriver的路径加入selenium.webdriver，再将淘宝网址输入到get函数中就可以打开网页。\n",
    "\n",
    "然后我们只需要找到搜索框，输入我们想要查询的商品品类，就可以找到相关商品的图片。因为淘宝的搜索功能需要登陆，所以我们此时还需将浏览器切入到登录的页面。登录完成之后我们就可以获取到搜索的结果。\n",
    "\n",
    "然后我们只需要获取并拼接图片的下载地址，然后选择本地的文件夹，并且顺序定义每个图片的名称，就可以将淘宝上的商品封面图片全部下载到本地文件中。\n",
    "\n",
    "**程序演示部分1 详见目录文件taobao.py**\n",
    "\n",
    "![4.1](figure\\4.1.jpg)\n",
    "\n",
    "爬取到的本地图片如图所示，但是在将这些图片用于训练之前，还需要将他们先转成灰度图，然后将大小压缩到$28\\times28$，并且将图片的数据放入到csv文件当中，实现这些步骤的主要程序如下\n",
    "\n",
    "**程序演示部分2 详见目录文件image_processing1.py**\n",
    "\n",
    "**程序演示部分3 详见目录文件image_processing2.py**\n",
    "\n",
    "至此，我们就可以将爬虫得到的图片，全部转成和第3节训练神经网络所使用的相同的数据集类型。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87434707",
   "metadata": {},
   "source": [
    "### 4.2 网络获取的数据集测试结果\n",
    "\n",
    "测试的步骤非常简单，只需要把程序最开始的test数据集fashion-mnist_test.csv换成爬虫得到的数据集fashion-mnist_test_taobao.csv即可，运行结果如下所示"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "adbf2b9c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "FashionCNN(\n",
      "  (layer1): Sequential(\n",
      "    (0): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "    (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (2): ReLU()\n",
      "    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      "  )\n",
      "  (layer2): Sequential(\n",
      "    (0): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1))\n",
      "    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (2): ReLU()\n",
      "    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      "  )\n",
      "  (fc1): Linear(in_features=2304, out_features=600, bias=True)\n",
      "  (drop): Dropout2d(p=0.25, inplace=False)\n",
      "  (fc2): Linear(in_features=600, out_features=120, bias=True)\n",
      "  (fc3): Linear(in_features=120, out_features=10, bias=True)\n",
      ")\n",
      "________________________________________\n",
      "Iteration: 500, Loss: 0.41743719577789307, Accuracy: 86.70166778564453%\n",
      "Iteration: 1000, Loss: 0.2587015926837921, Accuracy: 90.01000213623047%\n",
      "Iteration: 1500, Loss: 0.2851089537143707, Accuracy: 90.2683334350586%\n",
      "Iteration: 2000, Loss: 0.22474180161952972, Accuracy: 91.23833465576172%\n",
      "Iteration: 2500, Loss: 0.1754796952009201, Accuracy: 92.5999984741211%\n",
      "Iteration: 3000, Loss: 0.19251403212547302, Accuracy: 93.46333312988281%\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\"\"\"\n",
    "基于pytorch生成CNN网络，对淘宝爬虫数据集进行测试\n",
    "\"\"\"\n",
    "# import conmmands\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "from torch.autograd import Variable\n",
    "\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "from sklearn.metrics import confusion_matrix\n",
    "# use GPU while available\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "# load file\n",
    "train_csv = pd.read_csv(\"data_/fashion-mnist_train.csv\")\n",
    "test_csv = pd.read_csv(\"data_/fashion-mnist_test_taobao.csv\")\n",
    "\n",
    "\n",
    "class FashionDataset(Dataset):\n",
    "    \"\"\"User defined class to build a datset using Pytorch class Dataset.\"\"\"\n",
    "\n",
    "    def __init__(self, data, transform=None):\n",
    "        \"\"\"Method to initilaize variables.\"\"\"\n",
    "        self.fashion_MNIST = list(data.values)\n",
    "        self.transform = transform\n",
    "\n",
    "        label = []\n",
    "        image = []\n",
    "\n",
    "        for i in self.fashion_MNIST:\n",
    "            # first column are the labels\n",
    "            label.append(i[0])\n",
    "            image.append(i[1:])\n",
    "        self.labels = np.asarray(label)\n",
    "        # Dimension of Images = 28 * 28 * 1. where height = width = 28 and color_channels = 1.\n",
    "        self.images = np.asarray(image).reshape(-1, 28, 28, 1).astype('float32')\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        label = self.labels[index]\n",
    "        image = self.images[index]\n",
    "\n",
    "        if self.transform is not None:\n",
    "            image = self.transform(image)\n",
    "\n",
    "        return image, label\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.images)\n",
    "\n",
    "# Transform data into Tensor that has a range from 0 to 1\n",
    "train_set = FashionDataset(train_csv, transform=transforms.Compose([transforms.ToTensor()]))\n",
    "test_set = FashionDataset(test_csv, transform=transforms.Compose([transforms.ToTensor()]))\n",
    "\n",
    "train_loader = DataLoader(train_set, batch_size=100)\n",
    "test_loader = DataLoader(train_set, batch_size=100)\n",
    "\n",
    "def output_label(label):\n",
    "    output_mapping = {\n",
    "                 0: \"T-shirt/Top\",\n",
    "                 1: \"Trouser\",\n",
    "                 2: \"Pullover\",\n",
    "                 3: \"Dress\",\n",
    "                 4: \"Coat\",\n",
    "                 5: \"Sandal\",\n",
    "                 6: \"Shirt\",\n",
    "                 7: \"Sneaker\",\n",
    "                 8: \"Bag\",\n",
    "                 9: \"Ankle Boot\"\n",
    "                 }\n",
    "    input = (label.item() if type(label) == torch.Tensor else label)\n",
    "    return output_mapping[input]\n",
    "\n",
    "\n",
    "# Building CNN network\n",
    "class FashionCNN(nn.Module):\n",
    "\n",
    "    def __init__(self):\n",
    "        super(FashionCNN, self).__init__()\n",
    "\n",
    "        self.layer1 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1),\n",
    "            nn.BatchNorm2d(32),\n",
    "            nn.ReLU(),\n",
    "            nn.MaxPool2d(kernel_size=2, stride=2)\n",
    "        )\n",
    "\n",
    "        self.layer2 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3),\n",
    "            nn.BatchNorm2d(64),\n",
    "            nn.ReLU(),\n",
    "            nn.MaxPool2d(2)\n",
    "        )\n",
    "\n",
    "        self.fc1 = nn.Linear(in_features=64 * 6 * 6, out_features=600)\n",
    "        self.drop = nn.Dropout2d(0.25)\n",
    "        self.fc2 = nn.Linear(in_features=600, out_features=120)\n",
    "        self.fc3 = nn.Linear(in_features=120, out_features=10)\n",
    "\n",
    "    def forward(self, x):\n",
    "        out = self.layer1(x)\n",
    "        out = self.layer2(out)\n",
    "        out = out.view(out.size(0), -1)\n",
    "        out = self.fc1(out)\n",
    "        out = self.drop(out)\n",
    "        out = self.fc2(out)\n",
    "        out = self.fc3(out)\n",
    "\n",
    "        return out\n",
    "\n",
    "# make the model of CNN class\n",
    "model = FashionCNN()\n",
    "model.to(device)\n",
    "\n",
    "# define the loss function, here we use cross-entropy\n",
    "error = nn.CrossEntropyLoss()\n",
    "\n",
    "learning_rate = 0.001\n",
    "# Using Adam algorithm for optimization purpose\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)\n",
    "print(model)\n",
    "print('_'*40)\n",
    "\n",
    "# Network training parameters\n",
    "num_epochs = 5\n",
    "count = 0\n",
    "# Lists for visualization of loss and accuracy\n",
    "loss_list = []\n",
    "iteration_list = []\n",
    "accuracy_list = []\n",
    "\n",
    "# Lists for knowing classwise accuracy\n",
    "predictions_list = []\n",
    "labels_list = []\n",
    "\n",
    "# training\n",
    "for epoch in range(num_epochs):\n",
    "    for images, labels in train_loader:\n",
    "        # Transfering images and labels to GPU if available\n",
    "        images, labels = images.to(device), labels.to(device)\n",
    "\n",
    "        train = Variable(images.view(100, 1, 28, 28))\n",
    "        labels = Variable(labels)\n",
    "\n",
    "        # Forward pass\n",
    "        outputs = model(train)\n",
    "        loss = error(outputs, labels)\n",
    "\n",
    "        # Initializing a gradient as 0 so there is no mixing of gradient among the batches\n",
    "        optimizer.zero_grad()\n",
    "\n",
    "        # Propagating the error backward\n",
    "        loss.backward()\n",
    "\n",
    "        # Optimizing the parameters\n",
    "        optimizer.step()\n",
    "\n",
    "        count += 1\n",
    "\n",
    "        # Testing the model\n",
    "\n",
    "        if not (count % 50):  # It's same as \"if count % 50 == 0\"\n",
    "            total = 0\n",
    "            correct = 0\n",
    "\n",
    "            for images, labels in test_loader:\n",
    "                images, labels = images.to(device), labels.to(device)\n",
    "                labels_list.append(labels)\n",
    "\n",
    "                test = Variable(images.view(100, 1, 28, 28))\n",
    "\n",
    "                outputs = model(test)\n",
    "\n",
    "                predictions = torch.max(outputs, 1)[1].to(device)\n",
    "                predictions_list.append(predictions)\n",
    "                correct += (predictions == labels).sum()\n",
    "\n",
    "                total += len(labels)\n",
    "\n",
    "            accuracy = correct * 100 / total\n",
    "            loss_list.append(loss.data)\n",
    "            iteration_list.append(count)\n",
    "            accuracy_list.append(accuracy)\n",
    "\n",
    "        if not (count % 500):\n",
    "            print(\"Iteration: {}, Loss: {}, Accuracy: {}%\".format(count, loss.data, accuracy))\n",
    "\n",
    "# loss and accuracy visualizing\n",
    "# extract the loss & accuracy from tensor\n",
    "temp1 = np.zeros(len(iteration_list))\n",
    "temp1 = temp1.T\n",
    "temp2 = np.zeros(len(accuracy_list))\n",
    "temp2 = temp2.T\n",
    "for i in range(len(temp1)):\n",
    "    temp1[i] = loss_list[i].item()\n",
    "    temp2[i] = accuracy_list[i].item()\n",
    "\n",
    "plt.plot(iteration_list, temp1)\n",
    "plt.xlabel(\"Iteration Number\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.title(\"Iterations vs Loss\")\n",
    "plt.show()\n",
    "\n",
    "plt.plot(iteration_list, temp2)\n",
    "plt.xlabel(\"No. of Iteration\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.title(\"Iterations vs Accuracy\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "07388dea",
   "metadata": {},
   "source": [
    "## 5. 体会与感悟\n",
    "\n",
    "利用CNN卷积神经网络进行图片的分类，可以说是目前位置我所接触到的一个比较复杂的编程问题，这个问题的难度并不是集中在如何将数学问题转化到编程实际上，而是难在如何选择合适的工具进行训练、如何调节网络的参数以及如何一步步解决编程过程中程序和环境中的bug。\n",
    "\n",
    "在编程前的环境配置中，我尝试了pytorch和tensorflow两种工具来进行编程，而tensorflow需要在电脑上额外创建一个虚拟环境，花费了较多的时间，不过通过配置整个编程环境，我对anaconda的运行环景也有了更加深入的了解，也对之后继续进行机器学习的编程打下了基础。在综合考虑了一些方法之后，由于我自己对tensorflow的认识还比较有限，我还是选择了认识更加深入的pytorch来解决这个问题，接下来的难点就在进一步理解pytorch实现神经网络的框架，为此我也深入学习了pytorch官网中所给出的一系列教程，一步步地掌握了实现神经网络的一些重要步骤，在此基础上进行参数调试，最终得到了比较理想的结果。\n",
    "\n",
    "接下来需要解决的一个难题就是爬虫，因为之前对爬虫的相关知识了解还是比较少的，所以我在网上查阅了一些爬虫的实例，逐渐了解了爬虫的本质，也了解到了爬虫常用的两个库urllib和selenium，然后利用selenium工具包下载到了相关的图片，并且在图片处理的过程中我对图像的一些基本知识的了解也更加透彻。\n",
    "\n",
    "总而言之，这个项目让我对很多之前不熟悉的机器学习和图像处理的工具都有了初步的认识和一些实践的经验，也让我对机器学习可以实现的功能有了更加切身的体会，对于这方面知识也产生了很大的兴趣，在编程和debug的过程中也一步步提升了我的问题分析和解决能力，对我之后的课程学习起到了很大的促进和帮助作用，可以说这门机器学习课程不仅仅是让我收获了比较前沿的知识，更是让我学会了如何分析并解决一个大的问题，让我在之后的学习过程中思路可以更加清晰、方法也可以更加成熟多样。\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:root] *",
   "language": "python",
   "name": "conda-root-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
